package com.fac.controller.admin;

import com.fac.constant.CommonConstant;
import com.fac.dto.UsersDTO;
import com.fac.dto.UsersLoginDTO;
import com.fac.dto.UsersPageQueryDTO;
import com.fac.dto.UsersRegisterDTO;
import com.fac.entity.Users;
import com.fac.result.PageResult;
import com.fac.result.Result;
import com.fac.service.UsersService;
import com.fac.utils.JwtUtil;
import com.fac.vo.UsersVO;
import com.fac.properties.JwtProperties;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

import javax.validation.Valid;

/**
 * 用户管理控制器
 */
@RestController
@RequestMapping("/admin/users")
@Api(tags = "管理端-用户管理相关接口")
@Slf4j
public class UsersController {

    @Autowired
    private UsersService usersService;
    @Autowired
    private JwtProperties jwtproperties;

    /**
     * 用户登录
     */
    @PostMapping("/login")
    @ApiOperation("用户登录")
    public Result<UsersVO> login(@RequestBody UsersLoginDTO usersLoginDTO) {
        log.info("开始处理用户登录请求，登录信息：{}", usersLoginDTO);

        Users users = usersService.login(usersLoginDTO);
        log.info("用户登录成功，用户ID：{}", users.getUserId());

        // 生成JWT令牌
        Map<String, Object> claims = new HashMap<>();
        claims.put(CommonConstant.JWT_ADMIN_ID, users.getUserId());
        String token = JwtUtil.createJWT(
                jwtproperties.getAdminSecretKey(),
                jwtproperties.getAdminTtl(),
                claims
        );
        log.info("生成JWT令牌：{}", token);

        // 构建返回数据
        UsersVO usersVO = UsersVO.builder()
                .token(token)
                .userId(users.getUserId())
                .userName(users.getUsername())
                .build();

        log.info("用户登录处理完成，返回数据：{}", usersVO);
        return Result.success(usersVO);
    }

    /**
     * 用户退出
     */
    @PostMapping("/logout")
    @ApiOperation("用户退出")
    public Result<String> logout() {
        log.info("用户退出登录");
        return Result.success();
    }

    /**
     * 新增用户
     */
    @PostMapping
    @ApiOperation("新增用户")
    public Result<String> save(@RequestBody UsersDTO usersDTO) {
        log.info("开始新增用户，用户信息：{}", usersDTO);
        usersService.save(usersDTO);
        log.info("新增用户成功");
        return Result.success();
    }

    /**
     * 分页查询用户
     */
    @GetMapping("/page")
    @ApiOperation("分页查询用户")
    public Result<PageResult> page(UsersPageQueryDTO usersPageQueryDTO) {
        log.info("开始分页查询用户，查询条件：{}", usersPageQueryDTO);
        PageResult pageResult = usersService.pageQuery(usersPageQueryDTO);
        log.info("分页查询用户完成，总记录数：{}", pageResult.getTotal());
        return Result.success(pageResult);
    }

    /**
     * 根据ID查询用户详情
     */
    @GetMapping("/{userId}")
    @ApiOperation("根据ID查询用户详情")
    public Result<Users> get(@PathVariable("userId") Long userId) {
        log.info("开始查询用户详情，用户ID：{}", userId);
        Users users = usersService.getById(userId);
        log.info("查询用户详情完成，用户信息：{}", users);
        return Result.success(users);
    }

    /**
     * 更新用户
     */
    @PutMapping
    @ApiOperation("更新用户")
    public Result<String> update(@RequestBody UsersDTO usersDTO) {
        log.info("开始更新用户信息，更新内容：{}", usersDTO);
        usersService.updateByUserId(usersDTO);
        log.info("更新用户信息成功");
        return Result.success();
    }

    /**
     * 删除用户
     */
    @DeleteMapping("/{userId}")
    @ApiOperation("删除用户")
    public Result<String> delete(@PathVariable("userId") Long userId) {
        log.info("开始删除用户，用户ID：{}", userId);
        usersService.delete(userId);
        log.info("删除用户成功");
        return Result.success();
    }

    /**
     * 用户注册
     */
    @PostMapping("/register")
    @ApiOperation("用户注册")
    public Result<String> register(@Valid @RequestBody UsersRegisterDTO usersRegisterDTO) {
        log.info("开始处理用户注册请求，注册信息：{}", usersRegisterDTO);
        usersService.register(usersRegisterDTO);
        log.info("用户注册成功");
        return Result.success("注册成功");
    }
}
